package cn.tedu.charging.device.canal;

import cn.tedu.charging.device.constant.DeviceCacheKey;

import cn.tedu.charging.device.pojo.po.StationCanalPO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundGeoOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import top.javatool.canal.client.annotation.CanalTable;
import top.javatool.canal.client.handler.EntryHandler;

import javax.persistence.Column;
import java.io.Serializable;

/**
 * 场站信息同步处理器
 * 用来处理canal同步的数据
 * @CanalTable("charging_station") 表示 StationSyncHandler 要处理监听的表  charging_station
 *
 * StationCanalPO 表示要同步的数据
 * 数据的字段 需要增加
 *   @Column(name = "station_name")String stationName;
 */
@Slf4j
@Component
@CanalTable("charging_station") //告诉服务器监听哪个表，所以每个表都需要写一个处理器？？？
public class StationSyncHandler implements EntryHandler<StationCanalPO> {//EntryHandler里简单明了的增、删、改方法
    //启动后，device的控制台日志，看到canal在不断监听获取数据库的bin-log日志变动。

    @Autowired
    private RedisTemplate<String, Serializable> redisTemplate;

    @Override
    public void insert(StationCanalPO stationCanalPO) {
        log.debug("数据表 charging_station 插入了新的数据:{}", stationCanalPO);
        EntryHandler.super.insert(stationCanalPO);  //这行就是个canal监控的日志，实际执行insert和update，仿照下面delete，照着init那个类自己写
    }

    @Override
    public void update(StationCanalPO before, StationCanalPO after) {
        log.debug("数据表 charging_station 更新了数据,更新之前:{},更新之后:{}", before,after);
        //String类型 需要通过key 获取对应的value 更新为新的value 然后保存到Redis
        //Hash类型 可以通过大key和小key 更新指定的值
        //通过比较 before 和 after 如果位置变了 需要更新场站位置信息,如果场站基本信息变了,就更新基本信息
        EntryHandler.super.update(before, after);
    }

    @Override
    public void delete(StationCanalPO stationCanalPO) {
        log.debug("数据表 charging_station 删除了数据:{}", stationCanalPO);
        BoundGeoOperations stations = redisTemplate.boundGeoOps(DeviceCacheKey.STATION_LOCATION_KEY);
        String stationInfoStringKey = DeviceCacheKey.STATION_DETAIL_STRING_KEY + stationCanalPO.getId();
        String stationInfoHashKey = DeviceCacheKey.STATION_DETAIL_HASH_KEY  + stationCanalPO.getId();
        //删除删除场站的基本信息 String 类型的场站详情
        redisTemplate.delete(stationInfoStringKey);
        //删除删除场站的基本信息 Hash类型的场站详情
        redisTemplate.delete(stationInfoHashKey);
        //删除场站的位置信息
        //todo 怎么删除位置
        EntryHandler.super.delete(stationCanalPO);
    }

}
